package com.woniuxy.creditsystem.systemmag.controller;


import com.woniuxy.creditsystem.common.bean.UserInfo;
import com.woniuxy.creditsystem.common.util.DateUtil;
import com.woniuxy.creditsystem.common.util.ResultMsg;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户的登录和退出
 * @Author: hejie
 * @Date: 2020/12/10 14:50
 */
@RequestMapping("/sys")
@RestController
public class SystemController {

  public static void main(String[] args) {
        String pwd=new SimpleHash("MD5","123456","ccc".getBytes(),1024).toString();
        System.out.println(pwd);
        //63e84c7113b41850455c8df00c0f8c3a--lz
        //8a10e09438073ba4a7b3fcbb1caee578--superadmin
        //067f9afc8589779f8a6013758741403d--bbb
        //6f763a99d047ed179f30c2c5d23a4343--ccc
      //
    }

    /**
     * 退出系统
     * @author hejie
     * @return
     */
    @GetMapping(value = "/logout",produces = {"application/json;charset=utf-8"})
    public ResultMsg logout(){
        Subject subject=SecurityUtils.getSubject();
        //退出系统
        //销毁shiro提供的session中的数据，授权的缓存也失效
        subject.logout();
        return new ResultMsg(200,"退出系统成功",null);
    }

    /**
     * 登录方法
     * @author hejie
     * @param loginName
     * @param password
     * @return
     */
    @GetMapping(value="/login",produces = {"application/json;charset=utf-8"})
    public ResultMsg login(String loginName, String password, boolean rememberMe){
        ResultMsg rm = new ResultMsg(200,"登录成功",null);

        System.out.println("\nloginName="+loginName+"\tpassword="+password+"\trememberMe="+rememberMe+ DateUtil.TraceUtil.positionTrace());
        //取得当前的主体对象（就指"登录人"）
        Subject subject = SecurityUtils.getSubject();
        //判断当前主体，有没有被认证过
        //1.如果没有被认证过
        if(!subject.isAuthenticated()){
            //携带用户名和密码的Token令牌对象
            UsernamePasswordToken token = new UsernamePasswordToken(loginName,password);
            //如果选中了“记住我”
            if (rememberMe){
                token.setRememberMe(true);
            }
            try{
                //主体登录（--触发Realm（LoginAndAuthRealm.java）中 doGetAuthenticationInfo()）
                subject.login(token);
                rm.setCode(200);
                rm.setMsg("登录成功");
            }catch (Exception e){
                e.printStackTrace();
                rm.setCode(10000);
                rm.setMsg("登录名或密码不正确");
            }
        }
        //2.如果被认证过：在服务器session中的查看session的密码是否等于 要登录用户输入的密码
        //多个终端登录
        else{
            //根据主体对象 获得会话
            Session session = subject.getSession();
            //从会话中取得 登录信息
            UserInfo userInfo = (UserInfo) session.getAttribute("user");

            //将密码的明文转成密文，再对比
            String pwd=new SimpleHash("MD5",password,loginName,1024).toString();

            if(!userInfo.getPassword().equals(pwd)){
                rm.setCode(10000);
                rm.setMsg("登录名或密码不正确");
                //退出系统。防止用户试密码
                subject.logout();
            }
        }
        return rm;
    }
}
